/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package nadesicoi

import groovy.sql.*
import groovy.inspect.swingui.*
import com.griaule.grfingerjava.*;

/**
 *
 * @author Usuario
 */
class Usuarios {
	static def asignarA(serv) {
        serv.getUsuario       = getUsuario
        serv.addUsuario       = addUsuario
        serv.modUsuario       = modUsuario
        serv.checkFingerPrint = checkFingerPrint
    }
    static def checkFingerPrint = { fingerP ->
        try {
            Template        ref1, ref2;
            ref1            = new Template();
            ref2            = new Template();
            MatchingContext checador = null;
            def autorizado  = false, respuesta = null

            try {
                checador = new MatchingContext();
                ref1.setData(fingerP);
            } catch(grje) { Consola.error("Error al convertir hex a bytes", grje); throw grje }


            def db   = Sql.newInstance("jdbc:mysql://localhost/omoikane?user=root&password=", "root", "", "com.mysql.jdbc.Driver")
            def query, data = [:], usr_suc, mC = null

            try {
                    query = db.rows("SELECT id_usuario, nombre, huella1 ,huella2 , huella3 FROM usuarios");

                    try {
                        query.each
                        {
                            data['ID']       = it.id_usuario;
                            data['nombre']   = it.nombre;

                            mC = new MatchingContext()
                            ref2.setData(it.huella1);
                            if(ref2!=null)  {autorizado = (mC.verify(ref1, ref2));
                            if(!autorizado) {ref2.setData(it.huella2);  autorizado = (mC.verify(ref1, ref2)); }
                            if(!autorizado) {ref2.setData(it.huella3);  autorizado = (mC.verify(ref1, ref2)); }
                            }
                            if(mC != null)
                            {
                                mC.destroy();
                            }
                            if(autorizado) {
                                usr_suc    = db.rows("select * from usr_sucursal where id_usuario = ?", [data.ID])
                                data.sucursales = [:]
                                usr_suc.each {
                      
                                if(it.id_almacen != null && it.perfil != null) { data.sucursales[it.id_almacen] = it.perfil }
                                }
                                autorizado = data;
                                throw new Exception("BREAK") }
                        }
                    } catch(ex)  { if(ex.message != "BREAK") { throw ex } }

                    respuesta = (autorizado)?data:null
                    db.close()
                    return respuesta

            } catch(exc) {
                //consola.out.echo("Error: Datos incorrectos al identificar usuario.");
                db.close();
                Consola.error("Error al autenticar: ${exc.message}", exc)
                throw exc
            }
        } catch(e) { Consola.error("Error al identificar usuario", e); throw e }
    }
    static def getUsuario = { ID,IDAlmacen ->
        def salida = ""
        try {
        def db   = Sql.newInstance("jdbc:mysql://localhost/omoikane?user=root&password=", "root", "", "com.mysql.jdbc.Driver")
        def usr  = db.firstRow("SELECT * FROM usuarios WHERE id_usuario = $ID")
        if(usr==null) { return null }
        def idUsr    = usr.id_usuario
        def usra = db.firstRow("SELECT * FROM usr_sucursal WHERE id_almacen = $IDAlmacen AND id_usuario = "+ idUsr)
            db.close()
            salida = usr + usra
        } catch(e) { Consola.error("Error al consultar usuario (getUsuario)", e); throw new Exception("Error al consultar usuario") }
        salida
    }

    static def addUsuario = { Nombre,Huella1,Huella2,Huella3,NIP,Perfil,IDAlmacen ->
        def db
        try {
            db = Sql.newInstance("jdbc:mysql://localhost/omoikane?user=root&password=", "root", "", "com.mysql.jdbc.Driver")
            try {
                db.connection.autoCommit = false
                Huella1 = Sql.BLOB(Huella1)
                Huella2 = Sql.BLOB(Huella2)
                Huella3 = Sql.BLOB(Huella3)
                def IDCliente = db.executeInsert("INSERT INTO usuarios SET fecha_hora_alta=NOW(),nombre=?,huella1=?,huella2=?,huella3=?,nip=?", [Nombre,Huella1,Huella2,Huella3,NIP])
                IDCliente = IDCliente[0][0]
                db.executeInsert("INSERT INTO usr_sucursal SET id_almacen = ?, id_usuario= ?, perfil = ?",[IDAlmacen, IDCliente, Perfil])
                db.commit()
                return "Usuario $Nombre agregado."
            } catch(Exception e) {
                db.rollback()
                if(e.message.contains("Duplicate entry")) { return "El usuario que intenta capturar ya exíste" }
                Consola.error("Excepcion al modificar usuario",e)
                throw new Exception("Error al enviar a la base de datos. El Usuario no se registró.")
            } finally {
                db.close()
            }
        } catch(e) { throw new Exception("Error en la conexión del servidor con su base de datos") }
    }

    static def modUsuario = { Nombre,NIP,Perfil,IDAlmacen,IDUSR ->
        def db   = Sql.newInstance("jdbc:mysql://localhost/omoikane?user=root&password=", "root", "", "com.mysql.jdbc.Driver")
        try {
          db.connection.autoCommit = false
          db.executeUpdate("UPDATE usuarios SET nombre=?,nip=? WHERE id_usuario = ?"
                           , [Nombre,NIP,IDUSR])
          db.executeUpdate("UPDATE usr_sucursal SET perfil=? WHERE id_almacen =? AND id_usuario = ?",  [Perfil,IDAlmacen,IDUSR])
          db.commit()
          return "Usuario modificado existosamente"
        } catch(Exception e) {
            db.rollback()
            Consola.error("Excepcion al modificar usuario",e)
            throw new Exception ("Error al modificar usuario")
        } finally {
            db.close()
        }
    }

}

